package com.company.util;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @date : 2022/3/27 11:47
 */

@Component("logger")
@Aspect
public class Logger {

    @Pointcut("execution(public * com.company.aop.service.impl.AccountServiceImpl.*(..))")
    private void pointCutExp() {
    }

    /**
     * 打印日志信息
     */
    @Around("pointCutExp()")
    public Object printLog(ProceedingJoinPoint joinPoint) {
        Object result = null;
        // 明确调用切入点方法
        try {
            // 前置通知
            System.out.println("前置通知: Logger类中的printLog方法开始记录日志");
            // 获取切入点方法所需的参数
            Object[] args = joinPoint.getArgs();
            // 调用切入点方法并接收结果
            result = joinPoint.proceed(args);
            // 后置通知
            System.out.println("后置通知: Logger类中的printLog方法开始记录日志");
        } catch (Throwable throwable) {
            // 异常通知
            System.out.println("异常通知: Logger类中的printLog方法开始记录日志");
            throw new RuntimeException(throwable);
        } finally {
            // 最终通知
            System.out.println("最终通知: Logger类中的printLog方法开始记录日志");
        }
        return result;
    }
}
